// 给所有的函数添加一个 hycall 方法
/**
 * @param {any} thisArg // 需要绑定的 this
 * @param {any} args // 通过 ...args 接收不定量参数
 * @return {any}
 */
Function.prototype.hycall = function(thisArg, ...args) {
  console.log("hycall被调用了")
  // 1.这里需要获取需要改变 this 指向的函数(foo)
  var fn = this

  // 2. 对 thisArg 转正对象类型(防止传入的是非对象类型, 传入为 null, undefined 时，绑定 window)
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window

  // 3.此处调用了函数(foo)
  thisArg.fn = fn
  var res = thisArg.fn(...args)
  delete thisArg.fn

  // 4.将代码结果返回
  return res
}

function foo() {
  console.log("执行foo函数", this);
}

foo.hycall({}) // 隐式绑定 此时 hycall 函数的 this 为 foo 函数

